package ezonsport.android.ui.stepSystem.dataView;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.util.Log;

import ezonsport.android.core.stepSystem.StepData;
import ezonsport.android.data.DataHelper;
import ezonsport.android.service.GoalManageService;
import ezonsport.android.service.SportDataService;
import ezonsport.android.tools.DateUtil;



/**
 * 计步界面控制
 * @author 桑成龙
 *
 */
public class StepDataViewController {
	/**
	 * 定义全局变量stepDataViewModel
	 */
	private StepDataViewModel stepDataViewModel=null;//定义步数model
	private SportDataService sportDataService;//定义计步数据服务类
	private GoalManageService goalserVice=null;//定义运动目标服务类
	/**
	 * 构造函数
	 * @param ct:接收上下文参数
	 */
	DataHelper dataHelper=null;
	public StepDataViewController(DataHelper dataHelper){
		stepDataViewModel=new StepDataViewModel();
		this.dataHelper=dataHelper;
		sportDataService=new SportDataService(this.dataHelper);
		goalserVice=new GoalManageService(this.dataHelper);
	}

	/**
	 * 用于获取StepDataViewModel的实例
	 * @param fromDate：请求的开始日期
	 * @param toDate：请求的结束日期
	 * @return：返回StepDataViewModel实例
	 */
	public StepDataViewModel GetStepDataViewModel(Date fromDate,Date toDate){
		
		if(stepDataViewModel.getStepDataMap().size()==0){
			StepDataViewModel.setFromDate(fromDate);
			StepDataViewModel.setToDate(toDate);
			updateStepDataViewModel(fromDate,toDate);
			
		}else{
			long oldFrom=StepDataViewModel.getFromDate().getTime();//model记录数据的开始日期
			long oldTo=StepDataViewModel.getToDate().getTime();//model记录数据的结束日期
			long newFrom=fromDate.getTime();//用户请求的开始日期
			long newTo=toDate.getTime();//用户请求的结束日期
			if(newTo<=oldFrom){
				//当前用户请求的结束时间不在StepDataViewModel中，在此之前，左离
				updateStepDataViewModel(fromDate,toDate);
				StepDataViewModel.setFromDate(fromDate);//更新modle中的日期
			}else if((newFrom<=oldFrom)&&(newTo<=oldTo)){
				//当前用户请求，左交集
				updateStepDataViewModel(fromDate,StepDataViewModel.getFromDate());
				StepDataViewModel.setFromDate(fromDate);//更新modle中的日期
			}else if((newFrom>=oldFrom)&&(newTo<=oldTo)){
				//当前用户请求，已经完全包含在model中
				//do nothing
			}else if((newFrom<=oldTo)&&(newTo>=oldTo)){
				//当前用户请求，右交集
				updateStepDataViewModel(StepDataViewModel.getToDate(),toDate);
				StepDataViewModel.setToDate(toDate);//更新modle中的日期
			}else if(oldTo<=newFrom){
				//当前用户请求，右离
				updateStepDataViewModel(fromDate,toDate);
				StepDataViewModel.setToDate(toDate);//更新modle中的日期
			}
		}
		return stepDataViewModel;
	}
	
	/**
	 * 用于服务于GetStepDataViewModel方法，实现更新StepDataViewModel
	 * @param formDate:请求的开始日期
	 * @param toDate:请求的结束日期
	 * @return：返回void
	 */
	private void updateStepDataViewModel(Date fromDate,Date toDate){
		//SportDataService sportDataService=new SportDataService(this.dataHelper);
		List<StepData> lists=sportDataService.getStepData(fromDate, toDate);
		Map<Date, Integer> stepDataMap=stepDataViewModel.getStepDataMap();
		for(int i=0;i<lists.size();i++){
			stepDataMap.put(lists.get(i).getCollectTime(), lists.get(i).getSteps());
		}
		stepDataViewModel.setStepDataMap(stepDataMap);
		
	}
	/**
	 * 时间转化
	 * @param date：原始的时间
	 * @param i:增加的天数
	 * @return 加一天的时间
	 */
	private Date convertToDate(Date date,int i){
		Date date2 = DateUtil.dateConvert(new Date(date.getTime()+i*24*3600*1000));
		Log.i("MYName2", date2.toString());
		return DateUtil.dateNewConvert(new Date(date.getTime()+i*24*3600*1000));	
	}
	/**
	 * 设置......
	 */
	public void setStepDataViewModel(){
		
	}

	/**
	 * 添加新数据进入数据库
	 * @param fromDate:开始日期
	 * @param toDate：结束日期
	 * @param steps：存入的步数
	 */
	public void addStepToDB(Date fromDate,Date toDate,int steps){
		//SportDataService sportDataService=new SportDataService(this.dataHelper);
		sportDataService.addStepData(fromDate, toDate, steps);
		System.out.println("=============addStepToDB============");
	}
	
	/**
	 * 获取GoalManageViewModel对象的
	 * @param :Date planTime  获取指定日期的计划
	 * @param:Date toDate 获取结束日期 
	 * @return GoalManageViewModel实例
	 */
	public StepDataViewModel getGoalByDate(Date fromDate,Date toDate){
		Map<Date,Integer> stepGoalMap=new HashMap<Date, Integer>();
		Date mid=new Date();
		int count=(int) ((toDate.getTime()-fromDate.getTime())/(24*60*60*1000)); 
		for(int i=0;i<count;i++){
			mid=convertToDate(fromDate,i);
			int goal=goalserVice.getGoalByDate(mid);
			stepGoalMap.put(mid, goal);
		}

		stepDataViewModel.setStepGoalMap(stepGoalMap);
		return this.stepDataViewModel;
	}
}
